﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using gudusoft.gsqlparser;
using generador;

namespace parser
{
    class Program
    {

        static void Main(string[] args)
        {
            ArrayList infos_parseadas_del_log = new ArrayList();

            System.IO.StreamReader myFile =
                        new System.IO.StreamReader("../../../logslowquerysgenerado.log");
            // new System.IO.StreamReader("c:\\logslowquerysgenerado.log");
            
 
            while (!myFile.EndOfStream)
            {
                 
                InfoDeLaQuery info=ParsearInfoQuery(myFile);
                if(info!=null)
                     infos_parseadas_del_log.Add(info);
               
            }


           AgrupadorDeQuerysPorPatron agrupador = new AgrupadorDeQuerysPorPatron(infos_parseadas_del_log);
           List<SQLPattern> lista= agrupador.Agrupar();

            myFile.Close();

            //ImpresorDeQuerysPorPatron impresor = new ImpresorDeQuerysPorPatron(lista);
            //impresor.Imprimir();


            Console.ReadLine();

        }

        

        private static InfoDeLaQuery ParsearInfoQuery(System.IO.StreamReader myFile)
        {
            InfoDeLaQuery info1 = new InfoDeLaQuery();
            string[] temp;

            //primera linea
            string linea = LeerSalteandoLineasEnBlanco(myFile);
           
            if (linea == string.Empty)//LLEGUE AL FINAL DEL ARCHIVO NO TIENE SENTIDO SEGUIR
                return null;

            // # Time: 050718 19:45:58 
            temp = linea.Split(' ');
            string time = temp[temp.Length - 2] + " " + temp[temp.Length - 1];
            DateTime time_as_date = DateTime.Parse(time);
            info1.Time = time_as_date;

            //segunda linea
            linea = LeerSalteandoLineasEnBlanco(myFile);
            // # User@Host: db[db] @ localhost [127.0.0.1] 
            temp = linea.Split(' ');
            string userhost = "";
            for (int i = 2; i < temp.Length; i++)
            {
                userhost += temp[i];
            }
            info1.UserHost = userhost;


            //tercera linea
            linea = LeerSalteandoLineasEnBlanco(myFile);
            // # Query_time: 3 Lock_time: 0 Rows_sent: 43 Rows_examined: 10310 
            temp = linea.Split(' ');
            info1.QueryTime = int.Parse(temp[2]);
            info1.LockTime = int.Parse(temp[4]);
            info1.RowsSent = int.Parse(temp[6]);
            info1.RowsExamined = int.Parse(temp[8]);


            //la query
            linea = LeerHastaLaProximaLineaEnBlancoConcatenando(myFile);
            TGSqlParser sqlparser = new TGSqlParser(TDbVendor.DbVMssql);
             sqlparser.SqlText.Text =  linea;
            int iRet = sqlparser.Parse();

            if (iRet == 0)//todo ok
            {
                info1.Query = sqlparser.SqlStatements.First(); //solo asigne un statement en el generador!
            }
            else
            {
                throw new Exception("HUBO ERROR EN EL PARSEO DE LA QUERY");
            }

            return info1;
        }

        private static string LeerHastaLaProximaLineaEnBlancoConcatenando(System.IO.StreamReader myFile)
        {
            string result = LeerSalteandoLineasEnBlanco(myFile);
            if (result != string.Empty)
            {
                string temp;
                do
                {
                    if (!myFile.EndOfStream)
                    {
                        temp = myFile.ReadLine();
                        result += "  " + temp; //dejo espacio para no pegar palabras del statement que originalmente estan en 2 renglones distintos 
                    }
                    else 
                    {
                        temp = string.Empty; //esto es porque no deje un espacio blanco al final del archivo!!
                    }
                } while (temp != String.Empty );
            
            }
           
            return result;
        }

        //si retorna string en blanco es que llegue al final!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
        private static string LeerSalteandoLineasEnBlanco(System.IO.StreamReader myFile)
        {
            string result = String.Empty; 

            while(result==String.Empty && !myFile.EndOfStream)
            {
                result = myFile.ReadLine();
            }

            return result;
        }

        //private static void ChequearElTipoDeStatementParaAgruparlos(TCustomSqlStatement statement, InfoDeLaQuery info1)
        //{
        //     switch (statement.SqlStatementType)
        //    {
        //        case TSqlStatementType.sstSelect:
        //            break;
        //        case TSqlStatementType.sstDelete:
        //            break;
        //        case TSqlStatementType.sstInsert:
        //            //algo
        //            break;
        //        case TSqlStatementType.sstUpdate:
        //            //otro algo
        //            break;

        //        default:
        //            throw new Exception("no es de los tipos de statement que genere el statement parseado!!")
        //            break;
        //}

    }
}
